package cn.com.blueInfo.bpm.template.request;

import cn.com.blueInfo.bpm.common.request.BaseDTO;
import cn.com.blueInfo.bpm.common.request.BaseQueryDTO;
import cn.com.blueInfo.bpm.template.enums.NodeDecisionType;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;

/**
 * 节点流转规则表 接收参数机校验
 * @author suxch
 * @since 2025-08-24 01:41:15
 */
@Data
@EqualsAndHashCode(callSuper = true)
@Schema(description = "节点流转规则 接收参数及校验")
public class NodeDecisionDTO extends BaseDTO {

    /** 流程模板ID */
    @NotNull(message = "流程模板ID 不能为空")
    @Schema(description = "流程模板ID")
    private Long processId;
    /** 当前节点ID */
    @NotNull(message = "当前节点ID 不能为空")
    @Schema(description = "当前节点ID")
    private Long currentNodeId;
    /** 决策名称 */
    @NotBlank(message = "决策名称 不能为空")
    @Schema(description = "决策名称")
    private String decisionName;
    /** 决策类型：CONDITIONAL-条件决策，DEFAULT-默认决策 */
    @NotNull(message = "决策类型 不能为空")
    @Schema(description = "决策类型：CONDITIONAL-条件决策，DEFAULT-默认决策")
    private NodeDecisionType decisionType;
    /** 优先级（值越小越优先，多决策规则时生效） */
    @Schema(description = "优先级（值越小越优先，多决策规则时生效）")
    private Integer priority;
    /** 上一节点ID（NULL为起始决策） */
    @NotNull(message = "上一节点ID 不能为空")
    @Schema(description = "上一节点ID（NULL为起始决策）")
    private Long prevNodeId;
    /** 下一节点ID（NULL为结束决策） */
    @NotNull(message = "下一节点ID 不能为空")
    @Schema(description = "下一节点ID（NULL为结束决策）")
    private Long nextNodeId;
    /** 条件表达式 */
    @Schema(description = "条件表达式")
    private String conditionExpr;
    /** 默认审批意见 */
    @Schema(description = "默认审批意见")
    private String defaultOpinion;
    /** 提交时执行的函数 */
    @Schema(description = "提交时执行的函数")
    private String submitFunc;

    /**
     * 节点流转规则 接收分页查询参数
     * @author suxch
     * @since 2025-08-21 05:08:55
     */
    @Data
    @EqualsAndHashCode(callSuper = true)
    @Schema(description = "节点流转规则 接收分页查询参数")
    public static class QueryDTO extends BaseQueryDTO {

        /** 流程模板ID */
        @Schema(description = "流程模板ID")
        private Long processId;
        /** 当前节点ID */
        @Schema(description = "当前节点ID")
        private Long currentNodeId;
        /** 决策名称 */
        @Schema(description = "决策名称")
        private String decisionName;
        /** 决策类型：CONDITIONAL-条件决策，DEFAULT-默认决策 */
        @Schema(description = "决策类型：CONDITIONAL-条件决策，DEFAULT-默认决策")
        private NodeDecisionType decisionType;
        /** 优先级（值越小越优先，多决策规则时生效） */
        @Schema(description = "优先级（值越小越优先，多决策规则时生效）")
        private Integer priority;
        /** 上一节点ID（NULL为起始决策） */
        @Schema(description = "上一节点ID（NULL为起始决策）")
        private Long prevNodeId;
        /** 下一节点ID（NULL为结束决策） */
        @Schema(description = "下一节点ID（NULL为结束决策）")
        private Long nextNodeId;
        /** 条件表达式 */
        @Schema(description = "条件表达式")
        private String conditionExpr;
        /** 默认审批意见 */
        @Schema(description = "默认审批意见")
        private String defaultOpinion;
        /** 提交时执行的函数 */
        @Schema(description = "提交时执行的函数")
        private String submitFunc;

    }

    /**
     * 节点流转规则 接收部分更新参数及校验
     * @author suxch
     * @since 2025-08-21 05:08:55
     */
    @Data
    @EqualsAndHashCode(callSuper = true)
    @Schema(description = "节点流转规则 接收部分更新参数及校验")
    public static class UpdatePartialDTO extends BaseDTO {

        /** 优先级（值越小越优先，多决策规则时生效） */
        @Schema(description = "优先级（值越小越优先，多决策规则时生效）")
        private Integer priority;
        /** 条件表达式 */
        @Schema(description = "条件表达式")
        private String conditionExpr;
        /** 默认审批意见 */
        @Schema(description = "默认审批意见")
        private String defaultOpinion;
        /** 提交时执行的函数 */
        @Schema(description = "提交时执行的函数")
        private String submitFunc;

    }

}